Envelope.Weights

説明

エンベロープのデフォーマウェイトを含むClusterElementCollectionを戻します。ClusterElementCollection.Arrayプロパティは、2DArrayへのアクセスを提供します。この場合、最初の次元はEnvelope.Deformersにマップされ、2 番目の次元はクラスタエレメントにマップされます。

パラメータ

パラメータ タイプ 詳細
Time Double プロパティを取得する時間(フレーム)

デフォルト値:現在の時間(フレーム)

1. VBScript の例

' 
'       This example demonstrates how to access the
'       Weights information from a skeleton's envelope
'
NewScene , false
' Create the Skeleton
Dim oRoot, aRootPos, aEffPos1, aEffPos2, oChain1, oChain2
Set oRoot = Application.ActiveProject.ActiveScene.Root
aRootPos = Array(0.254, 3.998, 0.045)
aEffPos1 = Array(-0.01, -0.056, -2.972)
aEffPos2 = Array(0.183, -3.999, 0.115)
Set oChain1 = oRoot.Add2DChain( aRootPos, aEffPos1, , siViewTop )
Set oChain2 = oChain1.AddBone( aEffPos2 )
' Create the Envelope
Dim oSphere, oGeometry
Set oSphere = oRoot.AddGeometry( "Sphere", "MeshSurface")
oSphere.Parameters("subdivu").Value = 2
oSphere.Parameters("subdivv").Value = 2
Set oGeometry = oSphere.ActivePrimitive.Geometry
' Apply the Envelope to the Skeleton
Dim oEnvelope
Set oEnvelope = oSphere.ApplyEnvelope( oChain1, siBranch, siBranch )
' Get 2D array of element/deformer weights
Dim aWeights
aWeights = oEnvelope.Weights.Array
' Log weights
Dim iElement, strElementWeights, iDeformer, lString
For iElement = LBound(aWeights,2) to UBound(aWeights,2)
        strElementWeights = ""
        For iDeformer = LBound(aWeights,1) to UBound(aWeights,1)
                strElementWeights = strElementWeights & Round(aWeights(iDeformer,iElement)) & ","
        Next
        ' Trim the final comma from the string
        lString = Len(strElementWeights) - 1
        strElementWeights = Left( strElementWeights, lString )
        LogMessage "weight(" & iElement & ") = " & strElementWeights
Next
'Output of the script is this:
'INFO : "weight(0) = 0,0,100,0"
'INFO : "weight(1) = 0,100,0,0"
'INFO : "weight(2) = 0,50,50,0"
'INFO : "weight(3) = 0,50,50,0"
'INFO : "weight(4) = 0,50,50,0"

2. JScript の例

/*
        JScript version of the previous example, demonstrating 
        how to access the weights on each vertex
*/
NewScene( null, false ) ;
var oRoot = Application.ActiveProject.ActiveScene.Root ;
var aRootPos = new Array( 0.254, 3.998, 0.045 ) ;
var aEffPos1 = new Array( -0.01, -0.056,-2.972 ) ;
var aEffPos2 = new Array( 0.183,-3.999, 0.115 ) ;
// Create the Skeleton
var oChain1 = oRoot.Add2DChain( aRootPos, aEffPos1 ) ;
var oChain2 = oChain1.AddBone( aEffPos2 ) ;
// Create the Envelope
var oSphere = oRoot.AddGeometry( "Sphere", "MeshSurface" ) ;
oSphere.Parameters( "subdivu" ).Value = 2 ;
oSphere.Parameters( "subdivv" ).Value = 2 ;
var oGeometry = oSphere.ActivePrimitive.Geometry ;
// Apply the Envelope to the Skeleton
var oEnvelope = oSphere.ApplyEnvelope( oChain1, siBranch, siBranch ) ;
// Weights are represented as a 2-dimensional array,
// but it will be collapsed down to a 1-D array
// because JScript does not support multi-dimensional arrays
// (with each component listed one after another)
var aWeights = oEnvelope.Weights.Array.toArray() ;
var cntDeformers = oEnvelope.Deformers.Count ;
var cntVertices = aWeights.length / cntDeformers ;
var iElement = 0 ;
for ( iVertex=0 ; iVertex<cntVertices ; iVertex++ ) {
        strElementWeights = "" ;
        for ( iDeformer=0 ; iDeformer<cntDeformers ; iDeformer++ ) {
                strElementWeights += Math.round(aWeights[ iDeformer + iVertex * cntDeformers ]) ;
                if ( iDeformer != cntDeformers-1 ) {
                        strElementWeights += "," ;
                }
        }
        Application.LogMessage( "weight(" + iVertex + ") = " + strElementWeights ) ;
}
// Output of the script is this:
//INFO : "weight(0) = 0,0,100,0"
//INFO : "weight(1) = 0,100,0,0"
//INFO : "weight(2) = 0,50,50,0"
//INFO : "weight(3) = 0,50,50,0"
//INFO : "weight(4) = 0,50,50,0"

3. C# の例

/*
        See Envelope.GetWeights2 for a C# example of accessing envelope weights
*/

関連項目

Envelope.GetWeights2